AWS IoT
#AWS
https://gyazo.com/3abbaf85ab3dbcf3eed44e636f003bdd
AWS IoT とは
インターネットに接続されたデバイスとAWSクラウドとのセキュアな双方向通信を可能にする
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/what-is-aws-iot.html
主なコンポーネント
一部省略
デバイスゲートウェイ
デバイス/AWS IoT 間の通信
メッセージブローカー
Pub/Sub のための MQTT/WebSocket のブローカー
ルールエンジン
メッセージ処理と、他の AWS サービス (S3, DynamoDB, Lambda) との統合
Registry
デバイスに関連づけられたリソースの整理。カスタム属性等、管理に有用な情報を付与できる
Device Shadow
デバイスの永続表現。デバイスの最新の状態を AWS クラウド上に保持する
ルール
できること。
デバイスから受け取ったデータを、AWS DynamoDB に流し込む
Amazon SNS でプッシュ通知する
Amazon S3 にデータを保持する
AWS CloudWatch Logs に送信する
ルールのアクションが実行された時に引き受けるロールを定義する必要がある。
ルールの設定項目は以下。
ルール名
説明
SQL
MQTT トピックで受け取ったメッセージをフィルタ処理する
AWS IoT SQL リファレンス
SQL バージョン
アクション
1つのルールに複数のアクションを紐づけられる
DynamoDB テーブルへの挿入、S3 への配置、等
エラーアクション
===
IoT Core
X.509 証明書
AWS IoT でデバイスを認証する
AWS IoT ポリシー
AWS IoT 操作の実行をデバイスに許可する
メッセージブローカー
AWS IoT のメッセージの送受信を可能にするパブリッシュ/サブスクライブブローカーサービス
トピックは、AWS アカウント & region のペアにつき一意に定まる。
トピック
パブリッシュするクライアントからサブスクライブするクライアントに、メッセージを振り分けるための識別子。
Device Shadow
デバイスの現在の状態情報の保存と取得に使用される JSON ドキュメント
デバイスがインターネットに接続されていない状態でもデバイスの情報を取得できる
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-device-shadows.html
Raspberry Pi
AWS IoT + Raspberry Pi をやりたいときは、公式にドキュメントが存在する。まずは、モノ、証明書、AWS IoT ポリシーを各々設定しておく。
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sdk-setup.html
以下は、RaspberryPi 上での操作
code:shell
# node はインストール済みとする
$ npm install aws-iot-device-sdk
# node_modules/aws-io-device-sdk/examples 以下にサンプルプログラムが存在する
# 設定ファイルを用意して実行する
$ node node_modules/aws-iot-device-sdk/examples/device-example.js -f ../certifications -F ./config.json
設定ファイルは以下のような感じ。
code:json
{
"host": "yyyyyyyyyyyyy.iot.ap-northeast-1.amazonaws.com",
"port": 8883,
"clientId": "MyRaspberryPi",
"thingName": "MyRaspberryPi",
"caCert": "rootCA.crt",
"clientCert": "xxxxxxxxxx-certificate.pem.crt",
"privateKey": "xxxxxxxxxx-private.pem.key"
}
ディレクトリ構成は以下のような感じ。./app 以下で実行する。
code:shell
.
|-- app
| |-- config.json
| |-- node_modules/
| |-- package-lock.json
| `-- package.json
`-- certifications
|-- xxxxxxxxxx-certificate.pem.crt
|-- xxxxxxxxxx-private.pem.key
`-- rootCA.crt
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-device-sdk-node.html
存在しているサンプルプログラム。
device-example.js
AWS IoT エンドポイントに接続する MQTT インスタンスを立ち上げる
echo-example.js
jobs-agent.js
jobs-example.js
temperature-control/
thing-example.js
thing-passthrough-example.js
code:shell
node node_modules/aws-iot-device-sdk/examples/device-example.js -f ../certifications -F ./config.json --test-mode=1
テストモードを 1 にして実行すると、topic_1 を subscribe し、topic_2 を publish する。ので、AWS IoT コンソール側で topic_1 を発行すると、それを Raspberry Pi が受信する。
code:shell
message topic_1 {
"message": "Hello from AWS IoT console"
}
https://github.com/aws/aws-iot-device-sdk-js
Lambda から IoT を実行する
AWS IoT Device SDK ではなく、AWS SDK を利用して IAM role で認証を行うのが良い。
https://stackoverflow.com/questions/46723699/publishing-message-from-aws-lambda-to-aws-iot
料金
課金要素は以下
接続時間
100 万分あたり 0.08 USD
1 年間デバイスを繋ぎっぱなしにすると 0.042 USD
メッセージング
100 万件あたり 1.0 USD
デバイスシャドウ/レジストリ
オペレーション 100 万回あたり 1.25 USD
ルールエンジン
ルーティング 100 万件あたり 0.15 USD
無料枠
接続時間 2,250,000 分
1 年は 525600 分 なので、デバイス 4 つ踏ん 
メッセージ 500,000 件
レジストリまたはデバイスシャドウのオペレーション 225,000 回
トリガールール 250,000 件、実行アクション 250,000 件
あとでよむ
https://dev.classmethod.jp/cloud/aws/how-to-use-and-develop-aws-iot-smart-at-aws-summit-tokyo-2018-2/